/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.regulacion;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.domain.SolicitudBaseController;
import co.gov.medellin.sdep.sisdep.gestion.exception.SolicitudException;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.BeanDireccion;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.GeoUbicacionClient;
import co.gov.medellin.sdep.sisdep.model.Persona;
import co.gov.medellin.sdep.sisdep.model.SolicitudPermiso;
import co.gov.medellin.sdep.sisdep.model.SolicitudRevalidacion;
import co.gov.medellin.sdep.sisdep.model.comp.SolicitudPermisoComp;
import co.gov.medellin.sdep.sisdep.regulacion.exception.SolicitudModificaException;
import co.gov.medellin.sdep.sisdep.regulacion.exception.SolicitudRevalidacionException;
import co.gov.medellin.sdep.sisdep.regulacion.exception.SolicitudRevalidacionRuntimeException;
import co.gov.medellin.sdep.sisdep.regulacion.service.ISolicitudRevalidacionService;

/**
 * @author Usuario
 * 
 */
public class SolicitudRevalidacionController extends SolicitudBaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/** bean para el manejo del formulario de busqueda SolicitudRevalidacion */
	private SolicitudRevalidacion solicitudrevalidacionSearch = new SolicitudRevalidacion();

	/** Objeto contenedor del listado de SolicitudRevalidacion luego de una consulta. */
	private transient DataModel solicitudrevalidacionListModel;

	/** bean para el manejo del formulario de creacion/edicion. SolicitudRevalidacion */
	private SolicitudRevalidacion solicitudrevalidacion = new SolicitudRevalidacion();

	/** instancia de servicio solicitudrevalidacionService */
	private ISolicitudRevalidacionService solicitudrevalidacionService;
	
	/**
	 * instancia del cliente de consumo para el ws de georeferencia
	 */
	private GeoUbicacionClient geoUbicacionClient;
	
	/** instancia un objeto de direccion local, en caso que el usuario no valide direccion al menos una vez */
	private BeanDireccion direccionLocal = new BeanDireccion();
	
	/** instancia un objeto de direccion local, en caso que el usuario no valide direccion al menos una vez */
	private Persona personaLocal = new Persona();
	
	/** instancia un objeto de permiso local, en caso que el usuario no valide si tiene un permiso vigente */
	private SolicitudPermiso solicitudPermisoLocal = new SolicitudPermisoComp();

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public SolicitudRevalidacionController() {
		this.solicitudrevalidacionListModel = new ListDataModel();
		cleanValues();
		
	}
	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return String
	 * @throws SolicitudException 
	 * @throws SolicitudModificaException 
	 */
	public void init(Long solicitudId) throws SolicitudException, SolicitudRevalidacionException {
//		cleanSearchValues();
		this.solicitud = getSolicitudService().get(solicitudId.longValue());
//		System.err.println(this.solicitudrevalidacion.getId());
		this.solicitudrevalidacion = getSolicitudrevalidacionService().get(solicitudId.longValue());
		
		if(this.solicitudrevalidacion == null){
			this.solicitudrevalidacion = new SolicitudRevalidacion();
			cleanValues();
			this.solicitudrevalidacion.setIdSolicitud(solicitudId);
			solicitudrevalidacion.setIdPersona(solicitud.getIdPersona());
			System.err.println("REVALIDACION PERMISO DE LA SOL : " + this.solicitudrevalidacion.getIdSolicitud());
		}else{
			if(this.solicitudrevalidacion.getAnexoCartaPermisoCambio().equalsIgnoreCase("S")){
				this.solicitudrevalidacion.setAnexoCartaPermisoCambioChk(true);
				System.err.println("true anexo");
			}else{
				this.solicitudrevalidacion.setAnexoCartaPermisoCambioChk(false);
				System.err.println("false anexo");
			}
			if(this.solicitudrevalidacion.getIdIndicadorCambio().equalsIgnoreCase("S")){
				this.solicitudrevalidacion.setIdIndicadorCambioChk(true);
				System.err.println("true cambio");
			}else{
				this.solicitudrevalidacion.setIdIndicadorCambioChk(false);
				System.err.println("false cambio");
			}
		
			this.solicitudrevalidacion.setIdClaseVentaStr(this.solicitudrevalidacion.getIdClaseVenta().toString());
			this.solicitudrevalidacion.setIdTipoCambioStr(this.solicitudrevalidacion.getIdTipoCambio().toString());
			this.solicitudrevalidacion.setIdTipoVentaStr(this.solicitudrevalidacion.getIdTipoVenta().toString());
			this.solicitudrevalidacion.setIdTipoAmoblamientoStr(this.solicitudrevalidacion.getIdTipoAmoblamiento().toString());
		}
		try {
			solicitudrevalidacion.setAntiguedadComerciante(getSolicitudrevalidacionService().getAgeOfTrader(solicitud.getIdPersona().longValue()));
		} catch (SolicitudRevalidacionException e) {
			System.err.println(e.getLocalizedMessage());
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 */
	private final void cleanValues() {
		this.solicitudrevalidacion.setId(null);
		this.solicitudrevalidacion.setIdPersona(null);
		this.solicitudrevalidacion.setIdPermisoPrevio(null);
		this.solicitudrevalidacion.setIdPermisoActual(null);
		this.solicitudrevalidacion.setIdSolicitud(null);
		
		//Propiedades renderizadas en el jsp
		this.solicitudrevalidacion.setIdIndicadorUbicacion("");
		this.solicitudrevalidacion.setIdTipoCambio(null);
		this.solicitudrevalidacion.setDireccionVenta("");
		this.solicitudrevalidacion.setAntiguedadComerciante(new Double(0));
		
		
		this.solicitudrevalidacion.setIdClaseVenta(null);
		this.solicitudrevalidacion.setIdTipoVenta(null);
		this.solicitudrevalidacion.setIdTipoAmoblamiento(null);
		this.solicitudrevalidacion.setHorario("");
		this.solicitudrevalidacion.setHorarioExtendido("");
		this.solicitudrevalidacion.setEstado("");
		this.solicitudrevalidacion.setUsuarioCrea(getLoggedUserID());
	}
	
	/**
	 * 
	 * @return
	 */
	public String checkAddress() {
		direccionLocal = getGeoUbicacionClient().getAddressLocalization(this.solicitudrevalidacion.getDireccionVenta());
		if(null == direccionLocal) {
			direccionLocal = new BeanDireccion();
		}
		solicitudrevalidacion.setCodigoBarrio(OracleHelper.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A" : direccionLocal.getCodBarrio());
		solicitudrevalidacion.setBarrio(OracleHelper.isNullorEmpty(direccionLocal.getValueNomBarrio()) ? "NO Disponible" : direccionLocal.getValueNomBarrio());
		solicitudrevalidacion.setCodigoComuna(OracleHelper.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A" : direccionLocal.getCodComuna());
		solicitudrevalidacion.setComuna(OracleHelper.isNullorEmpty(direccionLocal.getValueNomComuna()) ? "NO Disponible" : direccionLocal.getValueNomComuna());

		return "";
	}
	
	/**
	 * 
	 * @return
	 */
	public String checkPermisoFinalizado() {
		if (getSolicitudrevalidacion().getIdSolicitud() != null) {
			//Verificamos si la persona se encuentra registrada
			try {
				//Busqueda por tipo identificacion e identificacion
				getSolicitudrevalidacion().setIdPersona(getSolicitud().getIdPersona());
				solicitudPermisoLocal = getSolicitudrevalidacionService().findLastGrant(getSolicitudrevalidacion());
				System.err.println(this.getSolicitudrevalidacion().getIdSolicitud());
				//Se establece el indicador del permiso actual
				if(solicitudPermisoLocal != null){
					System.err.println("pase el if");
					getSolicitudrevalidacion().setIdPermisoPrevio(solicitudPermisoLocal.getId());
				}
				//Cambiar el tipo de excepcion.........			
			} catch (Exception e) {
				e.printStackTrace(System.err);
			}
		}
		if(null == solicitudPermisoLocal) {
			solicitudPermisoLocal = new SolicitudPermisoComp();
			solicitudPermisoLocal.setNumeroPermiso("");
			solicitudPermisoLocal.setFechaInicio(null);
			solicitudPermisoLocal.setFechaFin(null);
		}
		return "";
	}
	
	/**
	 * 
	 * @return String
	 */
	public String searchSolicitudRevalidacionByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getSolicitudrevalidacionService().load(1, 10,
					this.solicitudrevalidacionSearch);
			this.solicitudrevalidacionListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.solicitudrevalidacionListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.solicitudrevalidacionListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.SOLICITUDREVALIDACION_SEARCH_VIEW;
	}

  /**
	 * Metodo que permite espeficicar la funcionalidad para la gestion [Crear / Actualizar] de un elmento tipo:
	 * SolicitudRevalidacion.
	 *     
	 * @author programador.java@consult-soft.com  05-06-2012
	 * @return String Vista a la cual debe retornar
	 * 	 
	 */
	public String manage() {
		String returnView = AppConstants.SOLICITUDREVALIDACION_SEARCH_VIEW;
		if(this.solicitudrevalidacion.getId() == null) {
       returnView = create();
		} else {
       returnView = update();
		}
		return returnView;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.solicitudrevalidacion.getId() == null) {
				if(this.solicitudrevalidacion.isAnexoCartaPermisoCambioChk()){
					this.solicitudrevalidacion.setAnexoCartaPermisoCambio("S");
				}else{
					this.solicitudrevalidacion.setAnexoCartaPermisoCambio("N");
				}
				if(this.solicitudrevalidacion.isIdIndicadorCambioChk()){
					this.solicitudrevalidacion.setIdIndicadorCambio("S");
				}else{
					this.solicitudrevalidacion.setIdIndicadorCambio("N");
				}
				this.solicitudrevalidacion.setIdClaseVenta(new Long(this.solicitudrevalidacion.getIdClaseVentaStr()));
				this.solicitudrevalidacion.setIdTipoCambio(new Long(this.solicitudrevalidacion.getIdTipoCambioStr()));
				this.solicitudrevalidacion.setIdTipoVenta(new Long(this.solicitudrevalidacion.getIdTipoVentaStr()));
				this.solicitudrevalidacion.setIdTipoAmoblamiento(new Long(this.solicitudrevalidacion.getIdTipoAmoblamientoStr()));
//				this.solicitudrevalidacion.setidper
				getSolicitudrevalidacionService().insert(this.solicitudrevalidacion);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (SolicitudRevalidacionException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SolicitudRevalidacionRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("Permiso Revalidado " + msg, null, null);
		return AppConstants.SOLICITUDREVALIDACION_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.solicitudrevalidacion.getId() != null) {
				if(this.solicitudrevalidacion.isAnexoCartaPermisoCambioChk()){
					this.solicitudrevalidacion.setAnexoCartaPermisoCambio("S");
				}else{
					this.solicitudrevalidacion.setAnexoCartaPermisoCambio("N");
				}
				if(this.solicitudrevalidacion.isIdIndicadorCambioChk()){
					this.solicitudrevalidacion.setIdIndicadorCambio("S");
				}else{
					this.solicitudrevalidacion.setIdIndicadorCambio("N");
				}
				this.solicitudrevalidacion.setIdClaseVenta(new Long(this.solicitudrevalidacion.getIdClaseVentaStr()));
				this.solicitudrevalidacion.setIdTipoCambio(new Long(this.solicitudrevalidacion.getIdTipoCambioStr()));
				this.solicitudrevalidacion.setIdTipoVenta(new Long(this.solicitudrevalidacion.getIdTipoVentaStr()));
				this.solicitudrevalidacion.setIdTipoAmoblamiento(new Long(this.solicitudrevalidacion.getIdTipoAmoblamientoStr()));
				getSolicitudrevalidacionService().update(this.solicitudrevalidacion);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (SolicitudRevalidacionException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SolicitudRevalidacionRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("Permiso Revalidado " + msg, null, null);
		return AppConstants.SOLICITUDREVALIDACION_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createSolicitudRevalidacion() {
		solicitudrevalidacion = new SolicitudRevalidacion();
		solicitudrevalidacion.setId(null);
		solicitudrevalidacion.setUsuarioCrea(getLoggedUserID());
//		solicitudrevalidacion.setUsuarioModifica(getLoggedUserID());

		return AppConstants.SOLICITUDREVALIDACION_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateSolicitudRevalidacion() {
		Map params = getExternalContext().getRequestParameterMap();
		
		String solicitudrevalidacionDataIndex = (String) params
				.get("solicitudrevalidacionDataIndex");
		
		this.solicitudrevalidacion = (SolicitudRevalidacion) ((List) this.solicitudrevalidacionListModel
				.getWrappedData())
				.get(Integer.parseInt(solicitudrevalidacionDataIndex));
		
		if(this.solicitudrevalidacion.getAnexoCartaPermisoCambio().equalsIgnoreCase("S")){
			this.solicitudrevalidacion.setAnexoCartaPermisoCambioChk(true);
			System.err.println("true anexo");
		}else{
			this.solicitudrevalidacion.setAnexoCartaPermisoCambioChk(false);
			System.err.println("false anexo");
		}
		if(this.solicitudrevalidacion.getIdIndicadorCambio().equalsIgnoreCase("S")){
			this.solicitudrevalidacion.setIdIndicadorCambioChk(true);
			System.err.println("true cambio");
		}else{
			this.solicitudrevalidacion.setIdIndicadorCambioChk(false);
			System.err.println("false anexo");
		}
	
		this.solicitudrevalidacion.setIdClaseVentaStr(this.solicitudrevalidacion.getIdClaseVentaStr().toString());
		this.solicitudrevalidacion.setIdTipoCambioStr(this.solicitudrevalidacion.getIdTipoCambio().toString());
		this.solicitudrevalidacion.setIdTipoVentaStr(this.solicitudrevalidacion.getIdTipoVenta().toString());
		this.solicitudrevalidacion.setIdTipoAmoblamientoStr(this.solicitudrevalidacion.getIdTipoAmoblamiento().toString());
		
		return AppConstants.SOLICITUDREVALIDACION_UPDATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String cancelSolicitudRevalidacion() {
		return AppConstants.SOLICITUDREVALIDACION_SEARCH_VIEW;
	}


	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * @return the solicitudrevalidacionSearch
	 */
	public SolicitudRevalidacion getSolicitudrevalidacionSearch() {
		return solicitudrevalidacionSearch;
	}

	/**
	 * @param solicitudrevalidacionSearch the solicitudrevalidacionSearch to set
	 */
	public void setSolicitudrevalidacionSearch(
			SolicitudRevalidacion solicitudrevalidacionSearch) {
		this.solicitudrevalidacionSearch = solicitudrevalidacionSearch;
	}

	/**
	 * @return the solicitudrevalidacionListModel
	 */
	public DataModel getSolicitudrevalidacionListModel() {
		return solicitudrevalidacionListModel;
	}

	/**
	 * @param solicitudrevalidacionListModel the solicitudrevalidacionListModel to set
	 */
	public void setSolicitudrevalidacionListModel(
			DataModel solicitudrevalidacionListModel) {
		this.solicitudrevalidacionListModel = solicitudrevalidacionListModel;
	}

	/**
	 * @return the solicitudrevalidacion
	 */
	public SolicitudRevalidacion getSolicitudrevalidacion() {
		return solicitudrevalidacion;
	}

	/**
	 * @param solicitudrevalidacion the solicitudrevalidacion to set
	 */
	public void setSolicitudrevalidacion(SolicitudRevalidacion solicitudrevalidacion) {
		this.solicitudrevalidacion = solicitudrevalidacion;
	}

	/**
	 * @return the solicitudrevalidacionService
	 */
	public ISolicitudRevalidacionService getSolicitudrevalidacionService() {
		return solicitudrevalidacionService;
	}

	/**
	 * @param solicitudrevalidacionService the solicitudrevalidacionService to set
	 */
	public void setSolicitudrevalidacionService(
			ISolicitudRevalidacionService solicitudrevalidacionService) {
		this.solicitudrevalidacionService = solicitudrevalidacionService;
	}

	/**
	 * @return the geoUbicacionClient
	 */
	public GeoUbicacionClient getGeoUbicacionClient() {
		return geoUbicacionClient;
	}

	/**
	 * @param geoUbicacionClient the geoUbicacionClient to set
	 */
	public void setGeoUbicacionClient(GeoUbicacionClient geoUbicacionClient) {
		this.geoUbicacionClient = geoUbicacionClient;
	}

	/**
	 * @return the direccionLocal
	 */
	public BeanDireccion getDireccionLocal() {
		return direccionLocal;
	}

	/**
	 * @param direccionLocal the direccionLocal to set
	 */
	public void setDireccionLocal(BeanDireccion direccionLocal) {
		this.direccionLocal = direccionLocal;
	}

	/**
	 * @return the personaLocal
	 */
	public Persona getPersonaLocal() {
		return personaLocal;
	}

	/**
	 * @param personaLocal the personaLocal to set
	 */
	public void setPersonaLocal(Persona personaLocal) {
		this.personaLocal = personaLocal;
	}

	/**
	 * @return the solicitudPermisoLocal
	 */
	public SolicitudPermiso getSolicitudPermisoLocal() {
		return solicitudPermisoLocal;
	}

	/**
	 * @param solicitudPermisoLocal the solicitudPermisoLocal to set
	 */
	public void setSolicitudPermisoLocal(SolicitudPermiso solicitudPermisoLocal) {
		this.solicitudPermisoLocal = solicitudPermisoLocal;
	}


	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
